package com.tcd.explore.Util;

import com.jcraft.jsch.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.InputStream;
import java.util.Properties;

@Component
public class FtpUtil {
    private static Logger logger = (Logger) LoggerFactory.getLogger(FtpUtil.class);

    /**
     * ftp服务器ip地址
     */
    private static String host;

    @Value("${ftp.host}")
    public void setHost(String val) {
        FtpUtil.host = val;
    }

    /**
     * 端口
     */
    private static int port;

    @Value("${ftp.port}")
    public void setPort(int val) {
        FtpUtil.port = val;
    }

    /**
     * 用户名
     */
    private static String userName;

    @Value("${ftp.userName}")
    public void setUserName(String val) {
        FtpUtil.userName = val;
    }

    /**
     * 密码
     */
    private static String password;

    @Value("${ftp.password}")
    public void setPassword(String val) {
        FtpUtil.password = val;
    }

    /**
     * 存放图片的根目录
     */
    private static String rootPath;

    @Value("${ftp.rootPath}")
    public void setRootPath(String val) {
        FtpUtil.rootPath = val;
    }

    /**
     * 存放图片的路径
     */
    private static String imgUrl;

    @Value("${ftp.img.url}")
    public void setImgUrl(String val) {
        FtpUtil.imgUrl = val;
    }

    /**
     * 获取连接
     */
    private static ChannelSftp getChannel() throws Exception {
        //JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器，使用端口转发，X11转发
        // ，文件传输等等。你可以将它的功能集成到你自己的 程序中。
        // 同时该项目也提供一个J2ME版本用来在手机上直连SSHD服务器
        JSch jsch = new JSch();

        //->ssh root@host:port
        //、从JSch对象中获取Session，用于连接，并设置连接信息
        Session sshSession = jsch.getSession(userName, host, port);
        //设置密码
        sshSession.setPassword(password);
        /*Properties该类主要用于读取Java的配置文件，不同的编程语言有自己所支持的配置文件，
        配置文件中很多变量是经常改变的，
        为了方便用户的配置，能让用户够脱离程序本身去修改相关的变量设置。
        就像在Java中，其配置文件常为.properties文件，是以键值对的形式进行参数配置的。
        Properties（Java.util.Properties）*/
        Properties sshConfig = new Properties();
        /**设置配置类的属性为StrictHostKeyChecking为no.私钥为NO*/
        sshConfig.put("StrictHostKeyChecking", "no");
        sshSession.setConfig(sshConfig);
        //连接成功
        sshSession.connect();
        // 通过Session建立链接
        // 打开SFTP通道
        Channel channel = sshSession.openChannel("sftp");
        // 建立SFTP通道的连接
        channel.connect();
        //返回连接通道对象
        return (ChannelSftp) channel;
    }

    /**
     * ftp上传图片
     *
     * @param inputStream 图片io流
     * @param 路径，不存在就创建目录
     * @param imagesName  图片名称
     * @return urlStr 图片的存放路径
     */
    public static String putImages(InputStream inputStream, String imagesName) {
        try {
            //获得连接的方法
            ChannelSftp sftp = getChannel();
            String path = rootPath + "/";
            //切换到当前目录
            createDir(path, sftp);

            //上传文件
            sftp.put(inputStream, path + imagesName);
            logger.info("上传成功！");
            sftp.quit();
            sftp.exit();

            //处理返回的路径
            String resultFile;
            resultFile = imgUrl + imagesName;

            return resultFile;

        } catch (Exception e) {
            logger.error("上传失败：" + e.getMessage());
        }
        return "";
    }

    /**
     * 创建目录
     */
    private static void createDir(String path, ChannelSftp sftp) throws SftpException {
        //获得每一个文件
        String[] folders = path.split("/");
        //切换到根目录
        sftp.cd("/");
        //一直循环直到切换到目标路径
        for (String folder : folders) {
            if (folder.length() > 0) {
                try {
                    sftp.cd(folder);
                } catch (SftpException e) {
                    //如果没有该文件就创建再切换到该目录
                    sftp.mkdir(folder);
                    sftp.cd(folder);
                }
            }
        }
    }

    /**
     * 删除图片
     */
    public static void delImages(String imagesName) {
        try {
            ChannelSftp sftp = getChannel();
            String path = rootPath + imagesName;
            sftp.rm(path);
            sftp.quit();
            sftp.exit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
